#include "include.h"
#include "func.h"
#include "func_music.h"
#include "func_exspiflash_music.h"
#include "api_spiflash_ex.h"

#if (EX_SPIFLASH_SUPPORT)
#define MAX_TIMEOUT_TIME 30
#define MAX_MIC_TIMEOUT_TIME 5*60

#define SONG_INT_NUM 42
#define MAX_SONG_NUM 2
exspifalsh_msc_t exspi_msc AT(.buf.func.music);
u8 song_int_index=0;
AT(.text.func.music.table)
const u8 song_table[3]=
{
	2,1
};
AT(.text.func.music.table)
const u8 song_int_table[2]=
{
	3,5
};
AT(.text.func.music.table)
const u8 song_mic_table[2]=
{
	7,7
};
AT(.text.func.music.table)
const u8 led_mic_table[2]=
{
	LED_SEQUENCE_9,LED_SEQUENCE_7
};

AT(.text.func.music.table)
const u16 delay_info_table[3][3]=
{
	{500,500,500},
	{500,500,500},
	{0,0,0},
};


bool exspiflash_init(void)
{
    printf("exspiflash_init\n");
    spiflash1_init();
    if (!is_exspiflash_online()) {
        return false;
    }
    return true;
}
AT(.text.func.music)
void set_song_play_num(void)
{

	#if 1
	u8 led_mode;
	if(exspi_msc.song_mic_flag)
	{
		exspi_msc.cur_num=song_mic_table[0];
		led_mode=led_mic_table[sys_cb.mic_onoff];
	}
	else if(exspi_msc.song_int_flag)
	{
		printf("song_int_index:%d\n",song_int_index);
		if(song_int_index>1)
		{
			song_int_index=0;
		}
		exspi_msc.cur_num=song_int_table[song_int_index];
		song_int_index=!song_int_index;
		led_mode=LED_SEQUENCE_4;
	}
	else
	{
		if(exspi_msc.song_info[0].song_index>=MAX_SONG_NUM)
		{
			printf("song index err!!!!!!!!\n");
			exspi_msc.song_info[0].song_index=0;			
		}
		exspi_msc.cur_num=song_table[exspi_msc.song_info[0].song_index];
		led_mode=LED_SEQUENCE_3;
		
	}
	exspi_msc.pause=false;	
	amp_speaker_unmute();
	bsp_set_volume(MUSIC_VOL);
	exspifalsh_music_num_kick(exspi_msc.cur_num);
	bsp_set_led_mode(led_mode);
	#else
	u8 song_index=exspi_msc.song_info[exspi_msc.song_mode].song_index;
	u8 led_mode;
	if(exspi_msc.song_int_flag&&exspi_msc.song_mode==1)
	{
		if(song_int_index>1)
		{
			song_int_index=0;
		}
		exspi_msc.cur_num=max_song_int_table[song_int_index];
		song_int_index!=song_int_index;
		led_mode=LED_SEQUENCE_4;
	}
	else
	{
		if(song_index>=max_song_table[exspi_msc.song_mode])
		{
			printf("song index err!!!!!!!!\n");
			song_index=exspi_msc.song_info[exspi_msc.song_mode].song_index=0;
		}
		exspi_msc.cur_num= song_table[exspi_msc.song_mode][song_index];
		if(exspi_msc.song_mode==1)
		{
			led_mode=LED_SEQUENCE_3;
		}
		else
		{
			led_mode=LED_SEQUENCE_6;
		}
		if(sys_cb.language_mode>3)
		{
			sys_cb.language_mode=0;
		}
		exspi_msc.cur_num+=LANGUAGE_SONG_OFFSET*sys_cb.language_mode;
	}
	if(exspi_msc.song_mode!=1&&(sys_cb.language_mode==0))
	{
		set_vol_offset(6);
	}
	else
	{
		set_vol_offset(0);
	}
	exspi_msc.pause=false;	
	amp_speaker_unmute();
	bsp_set_volume(VOL_MAX);
	exspifalsh_music_num_kick(exspi_msc.cur_num);
	bsp_set_led_mode(led_mode);
	#endif

}
AT(.text.func.music)
void func_check_song_play(void)
{
	if (get_music_dec_sta() == MUSIC_STOP)
	{
		//u16 delay_time;
		if(exspi_msc.pause)
		{
			return;
		}	
		
		#if 1
		music_control(MUSIC_MSG_STOP);
		if(exspi_msc.song_mic_flag)
		{
			if(tick_check_expire(exspi_msc.song_ticks,1800))
			{
				exspi_msc.song_ticks=tick_get();
			}
			else
			{
				return;
			}
			exspi_msc.song_mic_flag=0;
			exspi_msc.pause=true;
			exspi_msc.timeout_cnt=0;
		}
		else
		{
			exspi_msc.pause=true;
			exspi_msc.timeout_cnt=0;			
			if(sys_cb.bt_connected&&exspi_msc.song_int_flag==0)
			{
				sys_cb.bt_connected=0;
				music_control(MUSIC_MSG_STOP);
				func_cb.sta = FUNC_BT;
				return;
			}
			exspi_msc.song_int_flag=1;
		}
		
		if(!sys_cb.mic_onoff)
		{
			amp_speaker_mute();
		}
		bsp_set_led_mode(LED_SEQUENCE_2);
		#else
		if(exspi_msc.song_language_flag)
		{
			exspi_msc.pause=true;
			exspi_msc.timeout_cnt=0;
			exspi_msc.song_language_flag=0;
			bsp_set_led_mode(LED_SEQUENCE_2);
			return;
		}
		if(exspi_msc.song_int_flag)
		{
			exspi_msc.pause=true;
			exspi_msc.timeout_cnt=0;
			bsp_set_led_mode(LED_SEQUENCE_2);
			return;
		}
		if(exspi_msc.song_mode==3)
		{
			exspi_msc.pause=true;
			exspi_msc.timeout_cnt=0;
			printf("last func:%d\n",func_cb.last);
			if(sys_cb.bt_connected)
			{
				music_control(MUSIC_MSG_STOP);
				func_cb.sta = FUNC_BT;
			}
			else
			{
				bsp_set_led_mode(LED_SEQUENCE_2);
			}
			return;
		}
		
		u8 song_index=exspi_msc.song_info[exspi_msc.song_mode].song_index;

		delay_time=delay_info_table[exspi_msc.song_mode][song_index];
		if(delay_time!=0)
		{

			if(tick_check_expire(exspi_msc.delay_ticks,delay_time))
			{
				exspi_msc.delay_ticks=tick_get();
				if(!exspi_msc.ticks_start)
				{
					printf("tick start:%d\n",delay_time);
					exspi_msc.ticks_start=1;
					return;
				}
			}
			else
			{
				return;
			}
			exspi_msc.ticks_start=0;
			printf("tick end!!\n");
		}
		switch(exspi_msc.song_mode)
		{
			case 0:
				if(exspi_msc.song_info[0].song_index==3)
				{
					exspi_msc.song_info[0].song_index++;
				}
				else
				{
					exspi_msc.song_info[0].song_index++;
					if(exspi_msc.song_info[0].song_index>=max_song_table[0])
					{
						exspi_msc.song_info[0].song_index=0;
					}
					exspi_msc.song_mode=1;
				}
				break;
			case 1:
				exspi_msc.song_info[1].song_index++;
				if(exspi_msc.song_info[1].song_index>=max_song_table[1])
				{
					exspi_msc.song_info[1].song_index=0;
				}
				exspi_msc.song_mode=2;
				break;
			case 2:
				if(exspi_msc.song_info[2].song_index==2)
				{
					exspi_msc.song_mode=3;//++;
					exspi_msc.song_info[2].song_index=0;
					return;
				}
				else
				{
					exspi_msc.song_info[2].song_index++;
					if(exspi_msc.song_info[2].song_index>=max_song_table[2])
					{
						exspi_msc.song_info[2].song_index=0;
					}
					exspi_msc.song_mode=3;
					return;
				}
				break;
		}
		
		set_song_play_num();
		#endif

	}
}
AT(.text.func.music)
void func_switch_song(void)
{
	printf("song_mode:%d\n",exspi_msc.song_mode);
	
	#if 1
	if(exspi_msc.song_mic_flag)
	{
		exspi_msc.song_mic_flag=0;
		//music_control(MUSIC_MSG_STOP);
		//return;
	}
	exspi_msc.timeout_cnt=0;
	music_control(MUSIC_MSG_STOP);
	if(exspi_msc.song_int_flag==0)
	{
		exspi_msc.song_int_flag=1;
	}
	else
	{
		exspi_msc.song_int_flag=0;
		exspi_msc.song_info[0].song_index++;
		if(exspi_msc.song_info[0].song_index>=MAX_SONG_NUM)
		{
			exspi_msc.song_info[0].song_index=0;
		}
	}
	#else
	music_control(MUSIC_MSG_STOP);
	switch(exspi_msc.song_mode)
	{
		case 0:
			exspi_msc.song_info[0].song_index++;
			if(exspi_msc.song_info[0].song_index>=(max_song_table[0]-1))
			{
				exspi_msc.song_info[0].song_index=0;
			}
			exspi_msc.song_mode=1;
			exspi_msc.song_int_flag=0;
		break;
		case 1:
			if(exspi_msc.song_int_flag==0)
			{
				exspi_msc.song_int_flag=1;
			}
			else
			{
				exspi_msc.song_int_flag=0;
				exspi_msc.song_info[1].song_index++;
				if(exspi_msc.song_info[1].song_index>=max_song_table[1])
				{
					exspi_msc.song_info[1].song_index=0;
				}
				exspi_msc.song_mode=0;
			}
		break;
		case 2:
			exspi_msc.song_mode=0;
			exspi_msc.song_int_flag=0;
		    exspi_msc.song_info[2].song_index++;
			if(exspi_msc.song_info[2].song_index==2)
			{
				exspi_msc.song_info[2].song_index=4;
			}
			if(exspi_msc.song_info[2].song_index>=max_song_table[2])
			{
				exspi_msc.song_info[2].song_index=0;
			}
		break;
		case 3:
			exspi_msc.song_mode=0;
			break;
		default:
		break;
	}
	#endif
	set_song_play_num();
}
AT(.text.func.music)
void func_switch_mic_onoff(u8 onoff)
{
	if(sys_cb.mic_onoff==0)
	{
		if(sys_cb.vbat_low)
		{
			return;
		}
		sys_cb.mic_onoff=1;
		exspi_msc.max_timeout_cnt=MAX_MIC_TIMEOUT_TIME;
		bsp_karaok_init(AUDIO_PATH_KARAOK, func_cb.sta);
		if (get_music_dec_sta() == MUSIC_PLAYING)
		{
			bsp_set_led_mode(LED_SEQUENCE_3);			
		}
		else
		{
			exspi_msc.song_mic_flag=1;
			exspi_msc.song_ticks=tick_get();
			music_control(MUSIC_MSG_STOP);
			set_song_play_num();
		}
	}
	else
	{
		sys_cb.mic_onoff=0;
		exspi_msc.max_timeout_cnt=MAX_TIMEOUT_TIME;
		bsp_karaok_exit(AUDIO_PATH_KARAOK);
		if(get_music_dec_sta() == MUSIC_PLAYING)
		{			
			bsp_set_led_mode(LED_SEQUENCE_3);			
		}
		else
		{
			exspi_msc.song_mic_flag=1;
			exspi_msc.song_ticks=tick_get();
			music_control(MUSIC_MSG_STOP);
			bsp_set_led_mode(LED_SEQUENCE_9);
			set_song_play_num();
		}
	}
}

AT(.text.func.music)
void func_exspifalsh_music_process(void)
{
    func_process();
	func_check_song_play();
}

AT(.text.func.music)
bool exspifalsh_music_image_check(void)
{
    if (is_exspiflash_online()) {
        exspi_msc.total_num = exspifalsh_music_get_file_total();
		printf("exspi_msc.total_num = %d\n",exspi_msc.total_num);
        if (exspi_msc.total_num > 0) {
            return true;
        }
    }
    return false;
}

AT(.text.func.music)
void func_check_timeout(void)
{
	#if 0
	if(sys_cb.mic_onoff)
	{
		exspi_msc.timeout_cnt=0;
		return;
	}
	#endif
	if(exspi_msc.pause)
	{
		exspi_msc.timeout_cnt++;
		printf("timeout cnt:%d",exspi_msc.timeout_cnt);
		//amp_speaker_mute();
		if(exspi_msc.timeout_cnt>=exspi_msc.max_timeout_cnt)
		{
			exspi_msc.timeout_cnt=0;
			//exspi_msc.song_int_flag=0;
			music_control(MUSIC_MSG_STOP);
			func_cb.sta = FUNC_PWROFF;
		}
	}
}
AT(.text.func.music)
void func_lower_power_check(void)
{
	u8 mic_off;
	if(sys_cb.mic_onoff&&sys_cb.karaok_init)
	 {
	 	
	 	mic_off=bsp_get_mic_vol_offset();
		if(sys_cb.mic_vol_offset!=mic_off)
		{
			sys_cb.mic_vol_offset=mic_off;
			sys_cb.music_vol_offset=mic_off;
			bsp_karaok_set_mic_volume();
			bsp_change_volume(MUSIC_VOL-mic_off);
		}
		if ((sys_cb.vbat <=2700) ||(adc_cb.vrtc_val>=0x39f))
		 {
		 	sys_cb.vbat_low=1;
			sys_cb.mic_onoff=0;
			bsp_karaok_exit(AUDIO_PATH_KARAOK);
		 }
	 }
	 else 
	{
		mic_off=bsp_get_mic_vol_offset();
		//printf("vol_offset:%d->offset:%d\n",mic_off,sys_cb.music_vol_offset);
		if(sys_cb.music_vol_offset!=mic_off)
		{
			sys_cb.music_vol_offset=mic_off;
			bsp_change_volume(MUSIC_VOL-mic_off-1);
		}
		
	}
}
AT(.text.func.music)
void func_song_info_init(void)
{
	//printf("first_into_song:%d\n",sys_cb.first_into_song);
	memset(&exspi_msc,0x0,sizeof(exspifalsh_msc_t));
}

AT(.text.func.music)
static void func_exspifalsh_music_enter(void)
{
    msg_queue_clear();
    if ((!exspifalsh_music_image_check())){
        func_cb.sta = FUNC_NULL;
        return;
    }
    func_song_info_init();
    func_cb.mp3_res_play = NULL;//func_exspifalsh_mp3_res_play;
    register_spi_read_function(spiflash1_read);
	amp_speaker_unmute();
    bsp_change_volume(0);
	#if SYS_KARAOK_EN
	if(sys_cb.mic_onoff)
	{
		music_control(MUSIC_MSG_STOP);
		bsp_karaok_init(AUDIO_PATH_KARAOK, func_cb.sta);
		delay_ms(10);
	}
	#endif
	bsp_set_volume(MUSIC_VOL);
    exspi_msc.cur_num = 1;            //默认从1首开始播放
    exspi_msc.pause = true;
	exspi_msc.pause_cnt=0;
	exspi_msc.song_index=0;
	exspi_msc.song_int_flag=0;
	printf("song mode:%d\n",sys_cb.song_mode);
	if(sys_cb.song_mode>1)
	{
		sys_cb.song_mode=0;
	}
	if(sys_cb.mic_onoff)
	{
		exspi_msc.max_timeout_cnt=MAX_MIC_TIMEOUT_TIME;
	}
	else
	{
		exspi_msc.max_timeout_cnt=MAX_TIMEOUT_TIME;
	}
	exspi_msc.song_info[0].song_index=0;
	if(sys_cb.wakeup_key==5)
	{
		sys_cb.wakeup_key=0;
		exspi_msc.song_int_flag=1;
		exspi_msc.song_info[0].song_index=1;
		bsp_set_led_mode(LED_SEQUENCE_2);
		return;
	}
	
	set_song_play_num();
}

AT(.text.func.music)
static void func_exspifalsh_music_exit(void)
{
    music_control(MUSIC_MSG_STOP);
	set_vol_offset(0);
	sys_cb.exspiflash_music_mode=0;
	sys_cb.bt_connected=0;
	if(sys_cb.mic_onoff)
	{
		 bsp_karaok_exit(AUDIO_PATH_KARAOK);
		 delay_ms(30);
	}
    register_spi_read_function(NULL);  //恢复内部SPI读接口.
    func_cb.last = FUNC_EXSPIFLASH_MUSIC;
}



AT(.text.func.music)
void func_exspifalsh_music(void)
{
    printf("%s\n", __func__);
	sys_cb.project_num=param_spiflash_project_num_read();
    func_exspifalsh_music_enter();
    while (func_cb.sta == FUNC_EXSPIFLASH_MUSIC) {
        func_exspifalsh_music_process();
        func_exspifalsh_music_message(msg_dequeue());
    }
    func_exspifalsh_music_exit();
}
#endif

